54. 螺旋矩阵

54. 螺旋矩阵

分析

59. 螺旋矩阵 II 相比,其实没什么差别,无非就是需要处理只有一横或者只有一竖的场景,其实这样很好处理,这样就不需要考虑到了边界转圈这些情况了,直接按一唯数组遍历即可。而且此时 rowNow 和 colNow 都不需要换。

解题

public List<Integer> spiralOrder(int[][] matrix) {
    int rows = matrix.length;
    int cols = matrix[0].length;
    Integer[] resultArr = new Integer[rows*cols];
    int rowNow=0,colNow=0;
    int rowMin = 0,rowMax = rows-1,colMin = 0,colMax = cols-1;
    for(int i=0;i<rows*cols;i++){
        if(colMin==colMax || rowMin==rowMax){
            // 直接遍历完即可
            if(colMin==colMax && rowMin==rowMax){
                resultArr[i]=matrix[rowNow][colNow];
            }else{
                if(colMin==colMax){
                    // 不需要考虑转圈
                    resultArr[i]=matrix[rowNow][colNow];
                    rowNow++;
                }
                else if(rowMin==rowMax){
                    // 不需要考虑转圈
                    resultArr[i]=matrix[rowNow][colNow];
                    colNow++;
                }
            }
        }else if(rowNow==rowMin && colMin <= colNow && colNow < colMax ){
            resultArr[i]=matrix[rowNow][colNow];
            colNow++;
        }else if(colNow==colMax && rowMin <= rowNow && rowNow < rowMax ){
            resultArr[i]=matrix[rowNow][colNow];
            rowNow++;
        }else if(rowNow==rowMax && colMin < colNow && colNow <= colMax ){
            resultArr[i]=matrix[rowNow][colNow];
            colNow--;
        }else if(colNow==colMin && rowMin < rowNow && rowNow <= rowMax ){
            resultArr[i]=matrix[rowNow][colNow];
            rowNow--;
            if(colNow==colMin && rowNow==rowMin ){
                rowMin++;
                rowMax--;
                colMin++;
                colMax--;
                // 重置起点
                colNow++;
                rowNow++;
            }
        }
    }
    return Arrays.asList(resultArr);
}

上面这种解法是我们在 59. 螺旋矩阵 II 中提出了三种解法中的第一种的延续,后面两种在解法在解决当前这道题的时候或多或少都会有点问题,不建议使用。
笨方法有时候就是最通用的方法。

相关题

59. 螺旋矩阵 II